package servidor;

import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.ArrayList;
import cliente.jugador;
import juego.comando;
import juego.juegoprotocol;
import servidor.serverboggle;
import servidor.servermetodos;
/**
 * Clase que conversa con el cliente cuando el servidor utiliza hilos.
 * @author 
 */
public class hiloserver implements Runnable {

    private Socket socket;   
    private int ident; //contiene el identificador
    private ArrayList<jugador> jugadores; 
    private servermetodos server;

    public hiloserver(Socket s, int ident, ArrayList<jugador> jugadores) {
        socket = s;
        setIdent(ident);
        this.jugadores = jugadores;        
    }

  
	public void run() {
        try {
        	comando respuesta = null;
        	String s          = null;
        	Object obj        = null;
        	Object objaux     = null;
        	InputStream is    = socket.getInputStream();
        	OutputStream os   = socket.getOutputStream();
        	ObjectOutputStream  outobj = new ObjectOutputStream(os);	
		    ObjectInputStream  inobj   = new ObjectInputStream(is);
          
		    server = new servermetodos(inobj, outobj);
        	

            if(is != null){            	
            	//se obtiene el objeto   
            	obj   = server.leerComando();
            	//se obtiene el comando en string
             	s = server.GetComando();             	
             	
            }
            
            if(os != null){            	
            	//cuandp los clientes se conectan se registran en la lista de jugadores del servidor
            	if(s.equalsIgnoreCase(juegoprotocol.OP_CONEXION)){
            		objaux = ++serverboggle.identificador;
            		if(serverboggle.identificador <= serverboggle.nrojugadores){
            			for(int i=0;i<=serverboggle.jugadores.size()-1;i++) {							
							if(serverboggle.jugadores.get(i).getIdentificador() == -1){
            					serverboggle.jugadores.get(i).setIdentificador(serverboggle.identificador);
            					serverboggle.jugadores.get(i).setNombre(((jugador)obj).getNombre());							
            					break;
            				}
						}
            			
            		}
            	}else if(s.equalsIgnoreCase(juegoprotocol.OP_TABLERO) || s.equalsIgnoreCase(juegoprotocol.OP_POSICIONES)) 
            		objaux = server.getCmdbruto().getExtrai(); 
            	//se procesa el comando
            	respuesta = server.procesarComando(obj,objaux);
            	
            	//se envia la respuesta del proceso
            	server.escribirRespuesta(respuesta);
            	
            } 
        } catch (IOException e) {
             e.printStackTrace();
        } catch (InterruptedException e) {
			
			e.printStackTrace();
		} finally {
           try {
        	   socket.close();
           } catch (IOException e) {
			
        	   e.printStackTrace();
           }           
        }
    }


	public jugador getJugadro(int index){
		return jugadores.get(index);
	}

	public void setIdent(int ident) {
		this.ident = ident;
	}

	public int getIdent() {
		return ident;
	}
}
